package com.heima.comment.service.impl;

import com.alibaba.fastjson.JSON;
import com.heima.comment.dto.CommentDto;
import com.heima.comment.dto.CommentLikeDto;
import com.heima.comment.dto.CommentSaveDto;
import com.heima.comment.dto.ContentDto;
import com.heima.comment.entity.ApComment;
import com.heima.comment.entity.ApCommentLike;
import com.heima.comment.entity.ApUser;
import com.heima.comment.entity.UpdateArticleMessage;
import com.heima.comment.feign.UserFeign;
import com.heima.comment.service.ICommentService;
import com.heima.comment.vo.ApCommentVo;
import com.heima.common.aliyun.GreenTextScan;
import com.heima.common.dto.ResponseResult;
import com.heima.common.dto.User;
import com.heima.common.enums.AppHttpCodeEnum;
import com.heima.common.util.AppThreadLocalUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.*;

@Service
public class CommentServiceImpl implements ICommentService {
    @Autowired
  private  UserFeign userFeign;
    @Autowired
   private MongoTemplate mongoTemplate;
    @Autowired
    private KafkaTemplate kafkaTemplate;
    @Value("${topic.commentTopic}")
    private String commentTopic;
//    添加评论
    @Override
    public ResponseResult saveComment(CommentSaveDto dto) {
        //      先通过线程的工具类获得user

        System.out.println("222222222222222222222222222222222222222222222222222222222222222222");
//        先判断字数是否大于140和dto是不是空
        if(dto==null||dto.getContent().length()>140){
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
        }
        User user = AppThreadLocalUtil.get();

        if(user==null){
            System.out.println("1111111111111111111111111111111111111111111111111111111111111111111111");
            return ResponseResult.errorResult(AppHttpCodeEnum.NEED_LOGIN);


        }

//        在判断是登录状态

//        安全过lv ---阿里文本审核   (zuo业)

        String content = dto.getContent();

//            获得了具体数据就应该从中提取文字和图片了‘
//            先提取文字


//            先审核文字
        Boolean textResult=checkText(content);
//            获得了一个状态 如果不通过就结束方法返回
        if(!textResult) return null;


//        创建一个apComment 评论信息的对象
        ApComment apComment=new ApComment();
        ResponseResult<ApUser> result = userFeign.getById(user.getUserId());
        //        远程调用user获得头像和id
       if(result.getCode().equals(AppHttpCodeEnum.SUCCESS.getCode())){
           ApUser data = result.getData();
           apComment.setAuthorId(data.getId());
           apComment.setImage(data.getImage());
       }
        //        根据实体类填充数据
       apComment.setEntryId(dto.getArticleId());
       apComment.setChannelId(dto.getChannelId());
       apComment.setType(0);
       apComment.setContent(dto.getContent());
       apComment.setLikes(0);
       apComment.setReply(0);
       apComment.setFlag(0);
       apComment.setCreatedTime(new Date());
       mongoTemplate.save(apComment);

        UpdateArticleMessage message=new UpdateArticleMessage();
        message.setAdd(1);
        message.setType(2);
        message.setArticleId(dto.getArticleId());
        String value = JSON.toJSONString(message);
        kafkaTemplate.send(commentTopic,value);


        return ResponseResult.okResult();









    }

    @Autowired
    private GreenTextScan textScan;


//这个方法是调用ali的第三方接口对文章的文字进行审核

    private Boolean checkText(String content) {
//        这个简单就是低矮哦用一下接口对返回值进行状态的比对修改文章状态
//        先立一个false的标志
        Boolean flage=false;

        try {
//            调用ali审查的接口
            Map map = textScan.greenTextScan(content);
//            获得状态
            String suggestion = (String) map.get("suggestion");
//            对返回的状态进行分类判断
            switch (suggestion){
                case "pass":
//                    审合通过
                    flage=true;
                    break;
                case  "block":

//                  审核不通过
                    break;


            }

        } catch (Exception e) {
            e.printStackTrace();
        }

        return flage;
    }





//    获得待审核的评论文字和图片

    private Map<String, Object> getTextAndImageByContent(String content) {
//        这个是接返回数据的
        Map<String,Object> map=new HashMap<>();
//        这个是接返回文字的
        StringBuilder stringBuilder=new StringBuilder();
//        这个是接返回的图片的
        List<String> images=new ArrayList<>();
//        然后将传过来的数据转化成ContentDto对象
        List<ContentDto> imageDtoList = JSON.parseArray(content, ContentDto.class);
        for (ContentDto contenDto:imageDtoList
        ) {
//            开始根据类型分类
            if(contenDto.getType().equals("text")){
//                文字的
                stringBuilder.append(contenDto.getValue());
            }else {
//                图片的
                if(!StringUtils.isEmpty(contenDto.getValue())){
                    images.add(contenDto.getValue());
                }
            }

        }
        map.put("text",stringBuilder.toString());
        map.put("image",images);
        return map;

    }







//点赞评论
    @Override
    public ResponseResult like(CommentLikeDto dto) {
//        首先获得用户信息
        User user = AppThreadLocalUtil.get();
        if(user==null){
            return ResponseResult.errorResult(AppHttpCodeEnum.NEED_LOGIN);


        }//        创建一个点赞的信息记录

        ApCommentLike like=new ApCommentLike();
        like.setCommentId(dto.getCommentId());
        like.setAuthorId(user.getUserId());
        like.setOperation(dto.getOperation());

//        判断当前用户是否对此评论进行了点赞
        Query query=new Query();
//        根据用户id和评论id查找
        query.addCriteria(Criteria.where("authorId").is(user.getUserId()));
        query.addCriteria(Criteria.where("commentId").is(dto.getCommentId()));
        ApCommentLike one = mongoTemplate.findOne(query, ApCommentLike.class);
        if(one==null){
            //        如果么有则添加记录并点赞次数加一
            mongoTemplate.save(like);

            Query commentQuery=new Query();
            commentQuery.addCriteria(Criteria.where("_id").is(dto.getCommentId()));
            Update update=new Update();
            update.inc("likes");
            mongoTemplate.updateFirst(commentQuery,update,ApComment.class);}
        else {


//        咱判断前端的点赞状态和后端记录的状态是否一样不一样就修改 0点赞 ，1 取消点赞
            if(one.getOperation()!=(dto.getOperation())){
                //            这个是点赞需要累加的数值
                int num=1;
//                修改点赞记录表的状态
                one.setOperation(dto.getOperation());
                mongoTemplate.save(one);
//                更新评论表的点赞数量
                if(dto.getOperation()==1){
                    num=-1;
                }
                Query commentQuery=new Query();
                commentQuery.addCriteria(Criteria.where("_id").is(dto.getCommentId()));

                Update update=new Update();
                update.inc("likes",num);
                mongoTemplate.updateFirst(commentQuery,update,ApComment.class);






            }




        }

return ResponseResult.okResult();

    }
//加载品论列表
    @Override
    public ResponseResult load(CommentDto dto) {

        if(dto.getSize()==null||dto.getSize()<=0||dto.getSize()>=20){
            dto.setSize(10);
        }
//        首先根局文章的id进行查询评论列表

//        按照创建时间进行倒叙排序
//        分页判断数据小于前端传递的最小时间
//        每页默认最小为10哥评论
        Query query=new Query();
        query.addCriteria(Criteria.where("entryId").is(dto.getArticleId()));
        query.addCriteria(Criteria.where("createdTime").lt(dto.getMinDate()));
//        分液和排序
        Pageable page = PageRequest.of(0, dto.getSize(), Sort.Direction.DESC, "createdTime");
        query.with(page);
        List<ApComment> apComments = mongoTemplate.find(query, ApComment.class);
//        创建一个集合存登录用户显示点赞的评论
        List<ApCommentLike>likes=new ArrayList<>();
        User user = AppThreadLocalUtil.get();
        //        然后判断用户哟哦没有进行登录  没有登录用户只能看到 评论 ，如果登录了则能看到评论的点赞状态
        if(user!=null){
//            这是登录用户后需要展示的
//            创建一个存储所有评论id的集合
            List<String>commentIds=new ArrayList<>();

            for (ApComment apComment:apComments
                 ) {
                commentIds.add(apComment.getId());
            }
            Query likeQuery=new Query();
            likeQuery.addCriteria(Criteria.where("authorId").is(user.getUserId()));
            likeQuery.addCriteria(Criteria.where("commentId").in(commentIds));
            likeQuery.addCriteria(Criteria.where("operation").is(0));
            likes = mongoTemplate.find(likeQuery, ApCommentLike.class);


        }
//       获取所有当前用户点赞id
        List<String> existCommentIds=new ArrayList<>();
        for (ApCommentLike like:likes
             ) {
            existCommentIds.add(like.getCommentId());

        }
//        返回的是vo对象
        List<ApCommentVo>vos=new ArrayList<>();
        for (ApComment apComment:apComments
             ) {
            ApCommentVo vo=new ApCommentVo();
            BeanUtils.copyProperties(apComment,vo);
            //                全部默认都是没有点赞的
            vo.setOperation(1);
//            如果包含改成点赞(这个就是登陆后的结果)
            if(existCommentIds.contains(apComment.getId())){
                vo.setOperation(0);

            }
            vos.add(vo);

        }




//

        return ResponseResult.okResult(vos);
    }

}
